package org.lsi.pl2.resnombres;

import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

public class PilaAmbitos {
	
	public static final String EMPTY = "empty";
	
	private Stack<Ambito> pila;
	private Ambito ambitoPrograma;
	private List<Ambito> todosAmbitos;
	
	public PilaAmbitos() {
		pila = new Stack<Ambito>();
		todosAmbitos = new LinkedList<Ambito>();
	}
	
	public void abrirAmbito(String nombre, String tipo) {
//		if (pila.size()==0 && !tipo.equals(AmbitosBuilder.TIPO_PROGRAMA)) {
//			throw new NoAmbitoAbiertoException(EMPTY, tipo);
//		}
		
		Ambito cabeza = null;
		if (pila.size()>0) {
			cabeza = pila.peek();
		}
		
//		if (tipoCabeza.equals(AmbitosBuilder.TIPO_PROGRAMA) && !tipo.equals(AmbitosBuilder.TIPO_CLASE)) {
//			throw new NoAmbitoAbiertoException(tipoCabeza,tipo);
//		}
//		if (tipoCabeza.equals(AmbitosBuilder.TIPO_CLASE) && !tipo.equals(AmbitosBuilder.TIPO_METODO)) {
//			throw new NoAmbitoAbiertoException(tipoCabeza,tipo);
//		}
//		if (tipoCabeza.equals(AmbitosBuilder.TIPO_METODO)) {
//			throw new NoAmbitoAbiertoException(tipoCabeza,tipo);
//		}
		
		Ambito nuevo = AmbitosBuilder.getInstance().createAmbito(nombre, tipo);
		if (pila.size()==0) {
			ambitoPrograma = nuevo;
		} else {
			nuevo.setContenedor(cabeza);
		}
		pila.push(nuevo);
	}
	
	public Ambito cerrarAmbito() {
		Ambito ret = null;
		if (pila.size()==0) {
			return null;
		} else {
			ret = pila.pop();
		}
		if (pila.size()==0) {
			ambitoPrograma = null;
		} else if (pila.size()>0) {
			ret.getContenedor().addDeclaracion(ret.getNombre(),ret.getDeclaracion());
		}
		todosAmbitos.add(ret);
		return ret;
	}
	
	public Ambito getAmbitoActual() {
		return pila.peek();
	}
	
	public Ambito getAmbitoPrograma() {
		return ambitoPrograma;
	}
	
	public List<Ambito> getTodosAmbitos() {
		return todosAmbitos;
	}
}
